package com.service.single.example.file;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.IdUtil;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;

/**
 * 日常文件-文件上传、下载、删除
 */
public class FileHandle {

    /**
     * 文件批量上传
     */
    public void batchUpload(MultipartFile[] files, HttpServletRequest request) {
        // 文件上传路径
        String path = "";
        if (files.length > 0) {
            for (MultipartFile file : files) {
                String originalFilename = file.getOriginalFilename();
                String id = IdUtil.getSnowflakeNextIdStr();
                String filePath = path + id + originalFilename.substring(originalFilename.lastIndexOf("."));
                try {
                    file.transferTo(new File(filePath));
                } catch (Exception e) {

                }
            }
        }
    }

    /**
     * 下载
     *
     * @param response
     */
    public void download(HttpServletResponse response) {
        String filePath = "文件上传路径";
        String fileName = "文件名称（包括文件格式）";
        try {
            // 创建输出流对象
            ServletOutputStream outputStream = response.getOutputStream();
            //以字节数组的形式读取文件
            byte[] bytes = FileUtil.readBytes(filePath);
            // 设置返回内容格式
            response.setContentType("application/octet-stream");
            // 把文件名按UTF-8取出并按ISO8859-1编码，保证弹出窗口中的文件名中文不乱码
            // 中文不要太多，最多支持17个中文，因为header有150个字节限制。
            // 这一步一定要在读取文件之后进行，否则文件名会乱码，找不到文件
            fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
            // 设置下载弹窗的文件名和格式（文件名要包括名字和文件格式）
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            // 返回数据到输出流对象中
            outputStream.write(bytes);
            // 关闭流对象
            IoUtil.close(outputStream);
        } catch (Exception ignored) {

        }
    }

    /**
     * 删除
     */
    public void delete() {
        String filePath = "文件上传路径";
        File file = new File(filePath);
        if (file.exists()) {
            file.delete();
        }
    }

    /**
     * 多文件合并示例
     */
    public void mergeFile() {
        String path1 = "/opt/data/fileDir/1.txt";
        String path2 = "/opt/data/fileDir/2.txt";
        try {
            File resultFIle = new File(path1);
            FileChannel resultChannel = new FileOutputStream(resultFIle, true).getChannel();
            FileChannel outFile = new FileInputStream(path2).getChannel();
            resultChannel.transferFrom(outFile, resultChannel.size(), outFile.size());
            outFile.close();
            resultChannel.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
